package com.epoch.client.kernel.listener;

import com.epoch.client.kernel.constant.CommonStorage;
import com.epoch.client.kernel.serve.SocketMappingManager;
import com.epoch.client.view.ChatFrame;
import com.epoch.common.Message;
import com.epoch.common.MessageType;
import com.epoch.common.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Date;
import java.util.Map;

/**
 * 这个类用于监听聊天页面中发送按钮的监听类；
 */

@Slf4j
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EnterListener implements ActionListener {
    JTextArea txtWillSend,txtAll;
    ChatFrame CF;
    Integer groupId;
    // todo: 要把群号加进去,就是群号不能是虚的。需要能够真的分群进行群聊。
    // todo: 解决一下服务端socket长链接的问题，在socket开启试讲过长之后就会断开连接。
    // 抛出的异常为: 2022年10月25日14:56:45 先告一段落吧
    // java.io.StreamCorruptedException: invalid stream header: 47455420
    //        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:866)
    //        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:358)
    //        at com.epoch.server.kernel.serve.EchoServer.<init>(EchoServer.java:40)
    //        at com.epoch.server.ServerApplication.main(ServerApplication.java:13)

    @Override
    public void actionPerformed(ActionEvent e) {
        Message message = new Message();
        //通过群ID获取对应客户端的聊天界面
        String text = CF.textAreaMsg.getText();
        if(text.length() == 0){
            JOptionPane.showMessageDialog(null,"消息不能为空");
        } else {
            //实例序列化化对象输出流，并将聊天信息发送给服务器
            try {
                /*
                通过constant的对象获得到的用户对象
                */
                User user = (User) CommonStorage.REPOSITORY.get("user");

                Socket socket = SocketMappingManager.getSocket(user.getName());
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

                //设置消息类型
                message.setMessageType(MessageType.MESSAGE_INFOR_NOR);
                message.setSender(user.getId());
                message.setGroupId(groupId);
                message.setSenderName(user.getName());
                message.setMessage(text);
                message.setDate(new Date());

                oos.writeObject(message);
                log.info("此条消息已发送：" + message.getMessage());
                CF.textAreaMsg.setText("");
            } catch (Exception E) {
                E.printStackTrace();
            }
        }
    }

}

